优化网格

您可以减少 Kanzi 应用程序显示的网格中的顶点数据量,以提高应用程序的性能。当减少网格顶点数据量时,kzb 文件的大小和运行时所需的 GPU 内存量都会减小。

编辑网格特性

您可以使用 网格特性编辑器 (Mesh Attributes Editor) 更改网格的顶点数据。
例如,您可以使用 网格特性编辑器 (Mesh Attributes Editor) 移除不使用的特性,并根据您的需求选择最佳的数据类型。

要编辑网格特性:

  1. 素材库 (Library) > 网格 (Meshes) 中右键点击要编辑的网格,然后选择打开网格特性编辑器 (Open Mesh Attributes Editor)
    网格特性编辑器 (Mesh Attributes Editor) 中,导入 (Import) 表格会在您将网格导入到 Kanzi Studio 时显示网格特性的语义、维数和数据范围。
  2. 导出 (Export) 表格中的网格特性编辑器 (Mesh Attributes Editor) 中,设置这些特性,以控制 Kanzi Studio 如何将网格导出到 kzb 文件:
    • 语义 (Semantic) 用于设置特性的含义。网格特性的语义与网格所用材质类型的着色器特性的语义相匹配。
      例如,位置、法线、切线、纹理坐标或颜色 vector。
      建议

      要查看和编辑材质类型的着色器特性的语义,在 素材库 (Library) > 材质和纹理 (Materials and Textures) > 材质类型 (Material Types) 中右键点击材质类型并选择打开着色器特性编辑器 (Open Shader Attributes Editor)

    • 语义索引 (Semantic Index) 用于设置材质类型中的特性的索引。
      例如,正确的纹理坐标。
      每个网格特性的语义索引与具有相同语义的着色器特性的语义索引相匹配。
    • 数据类型 (Data Type) 用于设置 Kanzi 在将特性存储到 GPU 内存和将其导出到 kzb 文件时使用的数据类型。请参阅 设置顶点缓存的正确大小
    • 维度 (Dimensions) 用于设置 Kanzi 用于特性的维数。
      您导入网格时 Kanzi Studio 自动设置该值。
    • 输出组件 (Output Components) 用于设置 Kanzi 要将特性映射到的组件。
      您导入网格时 Kanzi Studio 自动设置该值。
    • 导出 (Export) 用于设置 Kanzi 导出到 kzb 文件中的特性。
      选中要使用的特性的复选框,并清除不使用的特性的复选框。
      确保导出所有与网格正在使用的材质类型的着色器特性相匹配的那些特性。
      在本例中,不会导出切线和纹理坐标特性,原因在于它们并非网格所使用的材质类型的着色器特性。

    如果要导出的 kzb 文件具有您目前在 导出 (Export) 表格中设置的值,则网格特性编辑器 (Mesh Attributes Editor) 底部的状态栏会显示网格顶点数据的大小。

设置顶点缓存的正确大小

GPU 具有特定大小的顶点缓存。访问缓存中的网格顶点要比访问存储器中其他位置的顶点快一个数量级。您可以重新排列顶点缓冲区中的顶点和索引,以使缓存达到最佳值,从而为特定的缓存大小优化网格数据。

例如,16 字节的顶点缓存可以存储位置 + 法线 + 纹理坐标 (XYZ * 2 + XYZ * 2 + UV * 2),但不足以存储位置 + 法线 + 纹理坐标 + 颜色。

要为您的目标硬件设置正确的顶点缓存大小:

  1. 了解您的目标硬件的顶点缓存大小。
  2. Kanzi Studio 中选择工程 (Project) > 属性 (Properties) 并在二进制导出 (Binary Export) 属性的属性 (Properties) 中设置:
    • 优化网格 (Optimize Meshes) 为启用
      当您启用优化网格 (Optimize Meshes) 属性时,Kanzi Studio 会设置已导出网格的顶点缓存,以使用您在目标顶点缓存大小 (Target Vertex Cache Size) 属性中设置的尺寸。
    • 目标顶点缓存大小 (Target Vertex Cache Size) 设置成目标设备上的缓存大小,以字节为单位
    • 默认顶点特性数据类型 (Default Vertex Attribute Data Type) 设置成您要为顶点缓冲区特性使用的数据类型
      网格顶点缓冲区包含 Kanzi 用于发送数据至顶点着色器的一组特性。
      例如,如果您将默认顶点特性数据类型 (Default Vertex Attribute Data Type) 属性设置成半浮点 (Half-float),相比浮点 (Float),您将网格数据大小减少了一半,但也降低了网格精度。

为网格特性设置最佳的数据类型

为了优化您的网格,请为每个网格特性设置占据最少空间但能够提供足够高的视觉精度以满足您需求的数据类型。Kanzi 在将特性存储到 GPU 内存和将其导出到 kzb 文件时使用数据类型。当使用占据最少空间的数据类型时,kzb 文件的大小和运行时所需的 GPU 内存量都会减小。请参阅 网格特性的数据类型

要为网格特性设置最佳的数据类型:

  1. 素材库 (Library) > 网格 (Meshes) 中右键点击要编辑的网格,然后选择打开网格特性编辑器 (Open Mesh Attributes Editor)
  2. 导入 (Import) 表格中的网格特性编辑器 (Mesh Attributes Editor) 中,为要设置的数据类型的特性检查数据范围 (Data Range) 列中的值。
    Kanzi Studio 会使用不同的颜色标记网格特性不同维度的数据范围。
  3. 导出 (Export) 表格中的网格特性编辑器 (Mesh Attributes Editor) 中,使用数据类型 (Data Type) 列中的下拉列表来设置导出数据类型。
    当设置数据类型时,请记住:
    • 请选择占据最少空间但能够提供足够高的视觉精度以满足您需求的数据类型。
      您可以在 网格特性编辑器 (Mesh Attributes Editor) 底部的状态栏中看到您设置的数据类型的网格顶点数据的大小,并以可视化方式检查 预览 (Preview) 中的渲染精度。
    • 选择其范围能够涵盖 数据范围 (Data Range) 列中的所有值的数据类型。请参阅 网格特性的数据类型
      例如,在大多数情况下,当特性的所有组件的数据范围为 0 ...1 时,您可以将 数据类型 (Data Type) 设置为 16_UNORM,当数据范围为 -1 ...1 时,您可以使用 16_SNORM
    • 可用数据类型的列表取决于您的目标图形 API 所支持的内容。请参阅 网格特性的数据类型
    • 规范化的 32 位数据类型(32_UNORM32_SNORM)可提供最高的精度。规范化的数据类型可以在数据范围内提供 uniform 的精度,而 浮点 (Float)半浮点 (Half-float) 数据类型可以为接近于 0 的值提供更高的精度,但较大的值的精度会下降。
    • 表格列出了用于为不同的网格特性选择导出数据类型的建议。
      语义 (Semantic)建议的数据类型Kanzi Engine 在导出之前规范化
      位置基于数据范围 
      法线、切线、双切线
      • OpenGL 2.0:16_SNORM
      • OpenGL 3.0:2_10_10_10_SNORM_PACK32
      x
      纹理坐标基于数据范围,16_UNORM / 16_SNORM / 浮点 (Float) 
      颜色 (Color)基于数据范围,8_UNORM / 半浮点 (Half-float) / 浮点 (Float) 
      权重 (Weight)基于数据范围 
      矩阵调色板基于数据范围 
         

网格特性的数据类型

表格列出了 Kanzi 支持的网格特性数据类型。

      目标图形 API (Target Graphics API) 的可用性
数据类型 描述 (Description) 范围 OpenGL ES 2.0 OpenGL ES 2.0 扩展包 (OpenGL ES 2.0 Extension Pack) OpenGL ES 3
浮点 (Float) 单精度浮点值(32 位)   x x x
半浮点 (Half-float) 半精度浮点值(16 位)     x x
8_SNORM 8 位有符号规范化数值 -1.0f ...1.0f x x x
8_UNORM 8 位无符号规范化数值 0.0f ...1.0f x x x
16_SNORM 16 位有符号规范化数值 -1.0f ...1.0f x x x
16_UNORM 16 位无符号规范化数值 0.0f ...1.0f x x x
8_SINT 8 位有符号整数 -128 ...127     x
8_UINT 8 位无符号整数 0 ...255     x
16_SINT 16 位有符号整数 -32768 ...32767     x
16_UINT 16 位无符号整数 0 ...65,535     x
32_SINT 32 位有符号整数 -2147483648 ...2147483647     x
32_UINT 32 位无符号整数 0 ...4 294 967 295     x
32_SNORM 32 位有符号规范化数值 -1.0f ...1.0f     x
32_UNORM 32 位无符号规范化数值 0.0f ...1.0f     x
2_10_10_10_SNORM_PACK32 四分量 32 位带符号的规范化压缩数值,带有:
  • 10 位 X 分量,0..9 位
  • 10 位 Y 分量,10..19 位
  • 10 位 Z 分量,20..29 位
  • 2 位 W 分量,30..31 位
(-1, -1, -1, -1) ...(1, 1, 1, 1)     x
2_10_10_10_UNORM_PACK32 四分量 32 位不带符号的规范化压缩数值:
  • 10 位 X 分量,0..9 位
  • 10 位 Y 分量,10..19 位
  • 10 位 Z 分量,20..29 位
  • 2 位 W 分量,30..31 位
(0, 0, 0, 0) ...(1, 1, 1, 1)     x
           

另请参阅

使用网格

网格最佳实践

编辑着色器

在 Kanzi 中使用 OpenGL ES 3.0